﻿// CarSocket.cpp : 实现文件
//

#include "stdafx.h"
#include "GHCY.h"
#include "../Hui/Hui.h"
#include "Car.h"
#include "GException.h"
#include "LogList.h"
#include "CarSocket.h"

// CarSocket

#ifdef _DEBUG
	#define new DEBUG_NEW
#endif

CarSocket::CarSocket( Car * pCar )
	: SocketWcs( pCar->m_strIP, pCar->m_nPort )
	, m_pCar( pCar )
{
	//m_hEventPost = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset, initially reset
}

CarSocket::~CarSocket()
{
}

// CarSocket 成员函数

// 发送1个字到PLC，h28
void CarSocket::sendData1(WORD /*data*/)
{
	//WORD da = data | 0x0400;	// 设置通信标记 H28.10
	//if (m_pCar->m_bCommunication)
	//	da |= 0x0200;	// 20181201 判断通讯中断标识，为真时如果通讯中断停车 H28.09
	//else
	//	da &= ~0x200;

	//sendData(28, &da, 1);	// 发送一个数到h28，下传控制指令
}

// 从PLC读取到数据
void CarSocket::onRead()
{
	/*
	// 读PLC完毕，用PostMessage方法通知主线程，不能用SendMessage和HNM，
	// 因为退出时主线程等待子线程结束，而子线程向主线程SendMessage时，
	// 会等待主线程处理消息，造成互相等待
	// ?? 用Post民步操作时可能出现一条数据还没有处理就读取了第二条数据，
	// ?? 或者两个消息处理了同一条数据。

//TRACE("PostMessage Tick %i\n", GetTickCount());

	// 20190127 改为直接调用，在子线程中执行setPos，用SendMessage时，在主线程中执行
	// 在子线程中执行时会出现一个线程计算路径另一个线程计算干涉时出错，又加一个m_bChangePath标识同步
	// ?? 同不会有别的同步问题
	// 20190218 因为无法解决同步问题，改为消息调用，到主线程中执行相关程序，主线程和子线程同时等待，以后想办法解决
	// 20200316 重新用m_pCar->readPLC(); 还用CSingleLock m_lockPath
	//theApp.m_pMainWnd->SendMessage( TWM_READPLC, (WPARAM)m_pCar );	// 这种方法是在主线程中运行，子线程还要等待
	m_pCar->readPLC();	// 直接在子线程中运行，不影响主线程运行，显示流畅

	//WaitForSingleObject(m_hEventPost, INFINITE);	// 等待消息被处理后再往下执行 //?? 异常

	// 20181102 增加发送通讯标志H28.10
	//if (m_sendQueue.nCount == 0	// 发送队列有值，并且上一次不是发送。即使发送队列中有值，也取一次数据再发送，避免长时间不取数据。
	//	&& !(m_pRecBuf[READHEADNUM + 28 * 2] & 0x04)	// H28.10 为 1 时不发送
	//	)
	//{
	//	sendBitByNum(28, 10, 1);
	//}

	// 20181201 增加允许通讯标志H28.09	//0181102 增加发送通讯标志H28.10
	if (m_sendQueue.nCount == 0)	// 发送队列有值，并且上一次不是发送。即使发送队列中有值，也取一次数据再发送，避免长时间不取数据。
	{
		//sendData1(m_pCar->m_pReadData->nCmd);	// 直接发全字可能出现错误置位
		
		// H28.10 为 1 时不发送
		if (!(m_pRecBuf[READHEADNUM + 28 * 2] & 0x04))
			sendBitByNum(28, 10, 1);

		// 允许中断标志不一致时发送
		if(m_pCar->m_bCommunication && !(m_pRecBuf[READHEADNUM + 28 * 2] & 0x02)
			|| !m_pCar->m_bCommunication && (m_pRecBuf[READHEADNUM + 28 * 2] & 0x02)
			)
		{
			WORD v = m_pCar->m_bCommunication ? 1 : 0;
			sendBitByNum(28, 9, v);
		}
	}
	*/
}

